package main

import "fmt"

func upp() int {
	var i int
	i++
	return i
}

func uppp() func() int {
	var i int
	return func() int {
		i++
		return i
	}
}

func main() {
	a := 10 // 外部变量
	// 直接由变量接住函数
	sayHello := func() {
		fmt.Println("匿名函数，外部变量a =", a)
	}
	sayHello() // 调用

	// 定义同时直接调用
	res := func(i, j int) int {
		return i + j
	}(10, 5)
	fmt.Println(res)

	func() {
		a++
		fmt.Println("闭包内a = ", a)
	}()
	fmt.Println("闭包外a = ", a)

	fmt.Print(upp()) // 1
	fmt.Print(upp()) // 1
	fmt.Print(upp()) // 1
	fmt.Println()
	f := uppp()
	fmt.Print(f()) // 1
	fmt.Print(f()) // 2
	fmt.Print(f()) // 3
	fmt.Println()
	// f没被释放，其中的i就一直有效
}
